//
//  HMUserAccountViewModel.swift
//  
//
//  Created by lst on 16/5/25.
//
//
import UIKit

private let userInfoKey = "com.itheima.userInfoKey"

class HMUserAccountViewModel: NSObject {
    
    //单例对象  伪单例
    static let sharedAccountViewModel: HMUserAccountViewModel = HMUserAccountViewModel()
    
    var userAccount: HMUserAccount?
    
    //重写构造方法 在构造方法中 加载用户的账户模型
    // private 私有化构造方法
    //如何让构造方法只调用一次 ==> 使用单例对象
    private override init() {
        
        super.init()
        userAccount = loadUserAccount()
    }
    
    
    //通过一判断用户是否登录的计算型属性 来解决 每次都需要判断的问题
    //计算型属性 每次调用都会执行
    var userLogin: Bool {
        
        if userAccount?.expires_date?.compare(NSDate()) == .OrderedDescending {
            return true
        }
        
        //如果过期  需要将 userAccount 设置为 nil
        userAccount = nil
        return false
    }
    
    //增加一个用户头像地址 纯种NSURL地址
    //只读属性 特点:每次执行都会进行计算
    var headURL: NSURL? {
        get {
            return NSURL(string: userAccount?.avatar_large ?? "")
        }
    }
}



extension HMUserAccountViewModel {
    //使用code 加载用户授权的token(令牌)
    func loadAccessToken(code: String, finished: (isSuccess: Bool) -> () ) {
        
        HMNetworkTools.sharedTools.loadAccessToken(code) { (responseObject, error) in
            print(responseObject,error)
            //请求token成功之后 使用token 和 uid 获取用户信息
            if error != nil {
                finished(isSuccess: false)
                return
            }
            //请求成功
            self.loadUserInfo(responseObject, finished: finished)
        }
        
       
    }
    
    //请求用户信息
    private func loadUserInfo(response: AnyObject?, finished: (isSuccess: Bool) -> () ) {
        
        guard let result = response as? [String : AnyObject] else {
            //回调自定义错误
                    //尝试将AnyObject? 类型的response 转换为 字典类型 如果转换不成功 就返回失败
            finished(isSuccess: false)
            return
        }
        
        
        HMNetworkTools.sharedTools.loadUserInfo(result) { (responseObject, error) in
            if error != nil {
                //                SVProgressHUD.showErrorWithStatus("世界上最遥远的距离就是没有网")
            
                finished(isSuccess: false)
                return
            }
            
            //请求成功
            guard var dict = responseObject as? [String : AnyObject] else {
                //                SVProgressHUD.showErrorWithStatus("世界上最遥远的距离就是没有网")
                finished(isSuccess: false)
                return
            }
            
            //用户信息  就应该保存用户信息到本地
            //合并两个字典 统一保存用户数据到本地
            for (key, value) in result {
                dict[key] = value
            }
            
            //这段代码被移动到 分类中进行封装处理
            self.saveUserAccount(dict)
            //完成成功的回调
            finished(isSuccess: true)
        }
    }
}


// 存取数据
extension HMUserAccountViewModel {
    //存储数据
    
    func saveUserAccount(dict: [String : AnyObject]) {
        //使用偏好设置 保存字典数据
        
        
        //1. 将dict 转换为 模型对象
        let user = HMUserAccount(dict: dict)
        // 为了 解决 从 未登录状态 -> 登陆状态 userAccount 为nil 的bug
        self.userAccount = user
        //2. 将模型对象转换字典
        let keys = ["access_token","expires_in","uid","name","avatar_large","expires_date"]
        let userInfo = user.dictionaryWithValuesForKeys(keys)
//        print(userInfo)
        //3. 保存字典数据
        let userDefaults = NSUserDefaults.standardUserDefaults()
        //不能够向 偏好设置中保存 nil
        userDefaults.setObject(userInfo, forKey: userInfoKey)
        //同步
        userDefaults.synchronize()
        
//        print(NSHomeDirectory())
    }
    
    //获取数据  减少这个方法调用 希望只执行一次
    func loadUserAccount() -> HMUserAccount? {
        //如果使用 as! 在偏好设置并没有保存数据的时候 程序会崩溃
        //频繁读取磁盘中数据 磁盘IO 性能不高 并且影响磁盘的寿命
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String : AnyObject] else {
            //防止没有存储数据的时候 程序崩溃的问题
            return nil
        }
        
        //字典转模型
        //再次判断用户的token是否过期 
        
        return HMUserAccount(dict: dict)
      
    }
}



